# 给定一组非负整数 nums，重新排列每个数的顺序（每个数不可拆分）使之组成一个最大的整数。
#  注意：输出结果可能非常大，所以你需要返回一个字符串而不是整数。
#
#  示例 1：
# 输入：nums = [10,2]
# 输出："210"
#
#  示例 2：
# 输入：nums = [3,30,34,5,9]
# 输出："9534330"
#
#  示例 3：
# 输入：nums = [1]
# 输出："1"
#
#  示例 4：
# 输入：nums = [10]
# 输出："10"
from typing import List


class Solution:
    def largestNumber(self, nums: List[int]) -> str:
        """
        排序
        自定义两数的大小规则
        规则为：
            将两个数字(x, y)按字符串的形式拼接在一起可以得到两个不同的字符串(x + y) 和 (y + x)
            他们转化成整数谁大则谁大

        :param nums:
        :return:
        """
        def compare(x: str, y: str):  # 定义数字的大小规则
            return int(y + x) - int(x + y)

        from functools import cmp_to_key
        tmpStrList = list(map(str, nums))  # 1.将所给的List[int] 转化成 list[str] 等价于下面写法
        # tmpStrList = [str(n) for n in nums]
        tmpStrList.sort(key=cmp_to_key(compare))  # 2.按照前面给的排序规则对转化后的list进行排序
        return "0" if nums[0] == "0" else "".join(tmpStrList)  # 3.将排序好的list拼接成字符串返回


if __name__ == "__main__":
    nums = [3, 30, 34, 5, 9]
    res = Solution().largestNumber(nums)
    print(res)
